home *** CD-ROM | disk | FTP | other *** search
/ Into His Marvelous Light / Into His Marvelous LIGHT.iso / ending.dxr / 00125_Script_Loop for X Seconds < prev    next >
Text File  |  2001-09-06  |  8KB  |  274 lines

  1. -- DESCRIPTION --
  2.  
  3. on getBehaviorDescription me
  4.   return "¼
  5. LOOP FOR X SECONDS: FRAME BEHAVIOR"&RETURN&RETURN&"¼
  6. This behavior will make the playback head loop for a fixed length of time over ¼
  7. a certain number of frames, then jump to a chosen marker.  You can choose ¼
  8. whether the playback head jumps immediately at the end of the period, or ¼
  9. whether it should run right through to the last frame of the span."&¼
  10. RETURN&RETURN&"¼
  11. Drag this behavior to the frame channel of the Score Window, then stretch it ¼
  12. out over the frames you wish to loop over.  If you wish to remain on the same ¼
  13. frame, then simply do not stretch out the sprite."&RETURN&RETURN&"¼
  14. PERMITTED MEMBER TYPES:"&RETURN&"Frame behavior"&RETURN&RETURN&"¼
  15. PARAMETERS:"&RETURN&"¼
  16. * Duration of loop (1 tick - 120 hours)"&RETURN&"¼
  17. * Marker to jump to at the end of the period"&RETURN&"¼
  18. * Playback head jumps immediately | at the end of the cycle"
  19. end getBehaviorDescription
  20.  
  21.  
  22.  
  23. on getBehaviorTooltip me
  24.   return "¼
  25. Frame behavior."&RETURN&"¼
  26. Stretch this behavior over a sequence"&RETURN&"¼
  27. of frames to make the playback head"&RETURN&"¼
  28. loop for a fixed length of time then"&RETURN&"¼
  29. jump to a chosen marker."&RETURN&RETURN&"¼
  30. Option: ensure that the cycle is fully"&RETURN&"¼
  31. completed before the playback head jumps."
  32. end getBehaviorTooltip
  33.  
  34.  
  35.  
  36. -- NOTES FOR DEVELOPERS --
  37.  
  38. -- Most Frame behaviors are intended to be triggered immediately.  This one
  39. -- is designed to be stretched over a number of frames, to act like a loop.
  40. -- The playback head will run the whole span of the sprite, then return to
  41. -- the frame it entered on.
  42. --
  43. -- Sprites in Director 7 can know where they begin and end, through the
  44. -- startFrame and endFrame properties.  This behavior exploits these to
  45. -- loop back to frame mySprite.startFrame when the playback head triggers
  46. -- the exitFrame handler in frame mySprite.endFrame
  47.  
  48.  
  49.  
  50. -- HISTORY --
  51.  
  52. -- 3 November 1998: written for the D7 Behaviors Palette by James Newton
  53. -- 19 November 1998: now handles #previous | #loop | #next
  54.  
  55.  
  56.  
  57. -- PROPERTIES --
  58.  
  59. -- author-defined parameters
  60. property myTimeOut
  61. property myTimeUnit
  62. property myTimeOutFrame
  63. property myImmediateJump
  64. -- internal properties
  65. property myStartFrame
  66. property myStartTicks
  67. property myEndFrame
  68.  
  69.  
  70.  
  71. -- EVENT HANDLERS --
  72.  
  73. on beginSprite me
  74.   Initialize me
  75. end beginSprite
  76.  
  77.  
  78. on exitFrame me
  79.   CheckTimeOut me
  80. end exitFrame
  81.  
  82.  
  83.  
  84. -- CUSTOM HANDLERS --
  85.  
  86. on Initialize me -- sent by beginSprite
  87.   thisSprite   = sprite(the currentSpriteNum)
  88.   myStartFrame = thisSprite.startFrame
  89.   myEndFrame   = thisSprite.endFrame
  90.   if symbolP (myTimeOutFrame) then
  91.     case (myTimeOutFrame) of
  92.       #previous: jumpToFrame = marker (-1)
  93.       #loop:     jumpToFrame = marker (0)
  94.       #next:     jumpToFrame = marker (1)
  95.     end case
  96.   else
  97.     jumpToFrame  = marker (myTimeOutFrame)
  98.   end if
  99.   
  100.   -- Error checking
  101.   if the currentSpriteNum then
  102.     ErrorAlert (me, #invalidChannel, the currentSpriteNum)
  103.   end if
  104.   
  105.   if not jumpToFrame then
  106.     jumpToFrame = myEndFrame + 1
  107.     ErrorAlert (me, #missingMarker, jumpToFrame)
  108.   else if jumpToFrame >= myStartFrame and jumpToFrame <= myEndFrame then
  109.     jumpToFrame = myEndFrame + 1
  110.     ErrorAlert (me, #endlessLoop, jumpToFrame)
  111.   end if
  112.   -- End of error checking
  113.   
  114.   myStartTicks = the ticks
  115.   
  116.   -- Convert properties
  117.   case myTimeUnit of 
  118.     #seconds: myTimeOut = myTimeOut * 60
  119.     #minutes: myTimeOut = myTimeOut * 60 * 60
  120.     #hours:   myTimeOut = myTimeOut * 60 * 60 * 60
  121.   end case
  122.   myTimeOut = myTimeOut + myStartTicks
  123.   myTimeOutFrame = jumpToFrame
  124.   myImmediateJump = (myImmediateJump = "jump immediately")
  125. end Initialize
  126.  
  127.  
  128. on CheckTimeOut me -- sent by exitFrame
  129.   if the ticks > myTimeOut then
  130.     if myImmediateJump or (the frame = myEndFrame) then
  131.       go myTimeOutFrame
  132.     end if
  133.   else if (the frame = myEndFrame) then
  134.     go myStartFrame
  135.   end if
  136. end CheckTimeOut 
  137.  
  138.  
  139.  
  140. -- ERROR CHECKING --
  141.  
  142. -- ERROR CHECKING --
  143.  
  144. on ErrorAlert me, theError, data
  145.   -- sent by getPropertyDescriptionList, Initialize
  146.   
  147.   case theError of
  148.     #getPDLError:
  149.       alert "¼
  150. Error: This behavior should dropped on the Stage or into the Behavior Channel ¼
  151. of the Score."&RETURN&RETURN&"¼
  152. Hit OK and then delete this behavior from the sprite."&RETURN&RETURN&"¼
  153. For more information on deleting Behaviors, see the Help system."
  154.       if the optionDown then
  155.         return ¼
  156. [ ¼
  157.  #getPDLError: ¼
  158.  [ ¼
  159.   #comment: "ERROR:   Frame Behavior.   Click 'Cancel'.", ¼
  160.   #format:  #string, ¼
  161.   #range:   [""], ¼
  162.   #default:  "" ¼
  163.  ] ¼
  164. ]
  165.       end if
  166.       
  167.     otherwise
  168.       -- Determine the behavior's name
  169.       behaviorName = string (me)
  170.       delete word 1 of behaviorName
  171.       delete the last word of behaviorName
  172.       delete the last word of behaviorName
  173.       
  174.       case theError of
  175.         #invalidChannel:
  176.           if the runMode = "Author" then
  177.             alert "¼
  178. BEHAVIOR ERROR: Frame "&the frame&", Sprite "&me.spriteNum&RETURN&RETURN&"¼
  179. Behavior "&behaviorName&"should be attached to the frame script channel."&¼
  180. RETURN&RETURN&"Current channel = "&data
  181.             abort
  182.           end if
  183.           
  184.         #missingMarker:
  185.           if the runMode = "Author" then
  186.             alert "¼
  187. BEHAVIOR ERROR: Frame "&the frame&", Sprite "&me.spriteNum&RETURN&RETURN&"¼
  188. Frame behavior "&behaviorName&"is set to jump to marker '"&myTimeOutFrame&"'.  ¼
  189. This marker cannot be found.  Choose a valid marker in the Behavior Parameters ¼
  190. dialog."&RETURN&RETURN&"¼
  191. In the meantime, frame "&data&" will be used instead."
  192.           end if
  193.           
  194.         #endlessLoop:
  195.           if the runMode = "Author" then
  196.             if symbolP (myTimeOutFrame) then
  197.               case (myTimeOutFrame) of
  198.                 #previous: jumpToFrame = marker (-1)
  199.                 #loop:     jumpToFrame = marker (0)
  200.                 #next:     jumpToFrame = marker (1)
  201.               end case
  202.             else
  203.               jumpToFrame  = marker (myTimeOutFrame)
  204.             end if
  205.             
  206.             alert "¼
  207. BEHAVIOR ERROR: Frame "&the frame&", Sprite "&me.spriteNum&RETURN&RETURN&"¼
  208. Frame behavior "&behaviorName&"is set to jump to marker '"&myTimeOutFrame&"' ¼
  209. (frame "&jumpToFrame&").   This is within the span of the behavior and will ¼
  210. cause an endless loop."&RETURN&RETURN&"¼
  211. Frame "&data&" will be used instead."
  212.           end if
  213.           
  214.       end case
  215.   end case
  216. end ErrorAlert
  217.  
  218.  
  219.  
  220. -- AUTHOR-DEFINED PARAMETERS --
  221.  
  222. on getPropertyDescriptionList me
  223.   
  224.   if the currentSpriteNum then
  225.     return ErrorAlert (me, #getPDLError)
  226.   end if
  227.   nextMarker = NextMarker (me)
  228.   
  229.   return ¼
  230. [ ¼
  231.  #myTimeOut: ¼
  232.  [ ¼
  233.   #comment: "Loop over selected frames for...", ¼
  234.   #format:  #integer, ¼
  235.   #range:    [#min: 1, #max: 120], ¼
  236.   #default:  30 ¼
  237.  ], ¼
  238.  #myTimeUnit: ¼
  239.  [ ¼
  240.   #comment: "", ¼
  241.   #format:  #symbol, ¼
  242.   #range:  [#ticks, #seconds, #minutes, #hours], ¼
  243.   #default: #seconds ¼
  244.  ], ¼
  245.  #myTimeOutFrame: ¼
  246.  [ ¼
  247.   #comment: "... then jump to marker:", ¼
  248.   #format:  #marker, ¼
  249.   #default:  nextMarker ¼
  250.  ], ¼
  251. #myImmediateJump: ¼
  252.  [ ¼
  253.   #comment: "When the time is up:", ¼
  254.   #format:  #string, ¼
  255.   #range:  ["complete the loop", "jump immediately"], ¼
  256.   #default: "jump immediately" ¼
  257.  ] ¼
  258. ]
  259. end getPropertyDescriptionList
  260.  
  261.  
  262. on NextMarker me -- sent by getPropertyDescriptionList
  263.   labelString = the labelList
  264.   delete the last char of labelString
  265.   markerCount = the number of lines of labelString
  266.   theFrame = the frame
  267.   repeat with i = 1 to  markerCount
  268.     theMarker = line i of labelString
  269.     markerFrame = marker (theMarker)
  270.     if theFrame < markerFrame then
  271.       return theMarker
  272.     end if
  273.   end repeat
  274. end NextMarker